<?php
/**
 * Classes utilitárias para a aplicação
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	util
 */
namespace rpo\util;

use \IteratorAggregate;
use \Countable;
use rpo\base\Object;

/**
 * Define a interface de uma coleção de objetos
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	util
 * @category	list
 */
interface Collection extends IteratorAggregate, Countable {
	/**
	 * Adiciona um novo objeto na lista
	 * @param Object $o
	 * @return boolean
	 */
	public function add( Object $o );

	/**
	 * Adiciona todos os objetos de uma coleção nessa coleção
	 * @param Collection $c
	 * @return boolean
	 */
	public function addAll( Collection $c );

	/**
	 * Limpa a coleção atual deixando-a sem nenhum elemento
	 * @return boolean
	 * @see Collection::isEmpty()
	 */
	public function clear();

	/**
	 * Verifica se a coleção atual pussui um determinado objeto
	 * @param Object $o
	 * @return boolean
	 */
	public function contains( Object $o );

	/**
	 * Verifica se a coleção atual possui todos os objetos de outra coleção
	 * @param Collection $c
	 * @return boolean
	 */
	public function containsAll( Collection $c );

	/**
	 * Verifica se a coleção atual é igual a outro objeto
	 * @param Object $o
	 * @return boolean
	 */
	public function equals( Object $o );

	/**
	 * Recupera um hash para identificação da coleção
	 * @return string
	 * @see Object::hashCode()
	 */
	public function hashCode();

	/**
	 * Verifica se a coleção está vazia
	 * @return boolean
	 * @see Collection::clear()
	 */
	public function isEmpty();

	/**
	 * Remove um elemento da coleção
	 * @param Object $o
	 * @return boolean
	 */
	public function remove( Object $o );

	/**
	 * Remove todos os objetos de uma outra coleção da coleção atual
	 * @param Collection $c
	 * @return boolean
	 */
	public function removeAll( Collection $c );

	/**
	 * Mantém na coleção apenas os elementos existentes na coleção especificada
	 * @param Collection $c
	 * @return boolean
	 */
	public function retainAll( Collection $c );

	/**
	 * Recupera uma matriz contendo os elementos da coleção
	 * @return array
	 */
	public function toArray();
}